﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Collections;
using System.Configuration;

namespace Siser.Web.Models
{
    public class ReporteAmbientalPDF
    {
        public byte[] reporteAmbPDF(string path, string fecha_generacion, ArrayList datos, string fechainicio, string fechafin, MemoryStream ms, MemoryStream ms1, MemoryStream ms2, MemoryStream ms3, MemoryStream ms4, DateTime fechaMax)
        {
            Document document = new Document(PageSize.A4, 50, 50, 25, 25);
            string ruta = path;
            
             
            MemoryStream memoryStream = new MemoryStream();
            PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
            PdfWriter.GetInstance(document, new FileStream(ruta, FileMode.Create));
            document.Open();
            Paragraph unParrafo = generar_cabecera();
            document.Add(unParrafo);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Paragraph info = generar_INFORMACION();
            document.Add(info);
            document.Add(new Paragraph(" "));
            List list = new List(List.UNORDERED);
            list.Add(new ListItem("Estación 1: Portería"));
            list.Add("Estación 2: Dosimetría");
            list.Add("Estación 3: Ciclotrón");
            list.Add("Estación 4: Estación Meteorológica");
            list.Add("Estación 5: Galpón Tecnológico");
            document.Add(list);
             document.Add(new Paragraph(" "));
             document.Add(new Paragraph(" "));

            Image unaImagen = plano();
            document.Add(unaImagen);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph("Datos obtenidos del periodo: " + fechainicio+" al "+ fechafin));
            document.Add(new Paragraph(" "));
            foreach (CReporteAmbiental t in datos)
            {
                document.Add(new Paragraph("Datos estadisticos detector ID: "+t.equipo_nombre));
                document.Add(new Paragraph(" "));
                PdfPTable estadistico = datos_estadisticos(t.promedio,t.varianza,t.desviacion,t.minimo,t.maximo,t.num_muestra, fechaMax);
                document.Add(estadistico);
                document.Add(new Paragraph(" "));
            }

            
            document.Add(new Paragraph(" "));
            
            document.Add(new Paragraph("Graficos de mediciones: "));
            document.Add(new Paragraph(" "));
            Paragraph alerta = new Paragraph("El límite de dosis al público es de 250 µR/h");
            alerta.Font.SetStyle(Font.BOLD);
            alerta.Font.SetColor(100, 0, 0);
            document.Add(alerta);
            document.Add(new Paragraph(" "));
            Image grafico1 = GenerarGrafico(ms);
            document.Add(grafico1);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico2 = GenerarGrafico(ms1);
            document.Add(grafico2);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico3 = GenerarGrafico(ms2);
            document.Add(grafico3);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico4 = GenerarGrafico(ms3);
            document.Add(grafico4);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico5 = GenerarGrafico(ms4);
            document.Add(grafico5);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));

            writer.CloseStream = false;
            document.Close();
            byte[] buf = new byte[memoryStream.Position];
            memoryStream.Position = 0;
            memoryStream.Read(buf, 0, buf.Length);
            return buf;
        }

        public byte[] reporteAmbPDFNoOf(string fecha_generacion, ArrayList datos, string fechainicio, string fechafin, MemoryStream ms, MemoryStream ms1, MemoryStream ms2, MemoryStream ms3, MemoryStream ms4,DateTime fechaMax)
        {
            Document document = new Document(PageSize.A4, 50, 50, 25, 25);
            string ruta = Path.Combine((ConfigurationManager.AppSettings["PathReporteAmbiental"]), "reporteAmb " + fecha_generacion + ".pdf");


            MemoryStream memoryStream = new MemoryStream();
            PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
            //PdfWriter.GetInstance(document, new FileStream(ruta, FileMode.Create));
            document.Open();
            Paragraph unParrafo = generar_cabeceranoof();
            document.Add(unParrafo);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Paragraph info = generar_INFORMACION();
            document.Add(info);
            document.Add(new Paragraph(" "));
            List list = new List(List.UNORDERED);
            list.Add(new ListItem("Estación 1: Portería"));
            list.Add("Estación 2: Dosimetría");
            list.Add("Estación 3: Ciclotrón");
            list.Add("Estación 4: Estación Meteorológica");
            list.Add("Estación 5: Galpón Tecnológico");
            document.Add(list);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));

            Image unaImagen = plano();
            document.Add(unaImagen);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph("Datos obtenidos del periodo: " + fechainicio + " al " + fechafin));
            document.Add(new Paragraph(" "));
            foreach (CReporteAmbiental t in datos)
            {
                document.Add(new Paragraph("Datos estadisticos detector ID: " + t.equipo_id + " - " + t.equipo_nombre));
                document.Add(new Paragraph(" "));
                PdfPTable estadistico = datos_estadisticos(t.promedio, t.varianza, t.desviacion, t.minimo, t.maximo, t.num_muestra, fechaMax);
                document.Add(estadistico);
                document.Add(new Paragraph(" "));
            }

            

            document.Add(new Paragraph("Graficos de mediciones: "));
            document.Add(new Paragraph(" "));
            Paragraph alerta = new Paragraph("El límite de dosis al público es de 250 µR/h");
            alerta.Font.SetStyle(Font.BOLD);
            alerta.Font.SetColor(100, 0, 0);
            document.Add(alerta);
            document.Add(new Paragraph(" "));
            Image grafico1 = GenerarGrafico(ms);
            document.Add(grafico1);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico2 = GenerarGrafico(ms1);
            document.Add(grafico2);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico3 = GenerarGrafico(ms2);
            document.Add(grafico3);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico4 = GenerarGrafico(ms3);
            document.Add(grafico4);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            Image grafico5 = GenerarGrafico(ms4);
            document.Add(grafico5);
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph(" "));
            document.Add(new Paragraph("DOCUMENTO DE USO INTERNO NO OFICIAL", FontFactory.GetFont("Arial", 8)));
            writer.CloseStream = false;
            document.Close();
            byte[] buf = new byte[memoryStream.Position];
            memoryStream.Position = 0;
            memoryStream.Read(buf, 0, buf.Length);
            return buf;
        }


        public static Paragraph generar_cabecera()
        {

            Paragraph parrafo = new Paragraph();

            parrafo.Alignment = Element.ALIGN_CENTER;
            parrafo.Font = FontFactory.GetFont("Arial", 14);
            parrafo.Font.SetStyle(Font.BOLD);
            parrafo.Leading = 10;
            parrafo.SpacingAfter = 1;
            parrafo.SpacingBefore = 1;


            parrafo.Add("FORMULARIO \r\n MONITOREO RADIOLOGICO \r\n CEN LA REINA \r\n SISER-CCHEN \r\n Version 1.0");

            return parrafo;
        }
        public static Paragraph generar_cabeceranoof()
        {

            Paragraph parrafo = new Paragraph();

            parrafo.Alignment = Element.ALIGN_CENTER;
            parrafo.Font = FontFactory.GetFont("Arial", 14);
            parrafo.Font.SetStyle(Font.BOLD);
            parrafo.Leading = 10;
            parrafo.SpacingAfter = 1;
            parrafo.SpacingBefore = 1;


            parrafo.Add("FORMULARIO \r\n MONITOREO RADIOLOGICO \r\n CEN LA REINA \r\n SISER-CCHEN \r\n Version 1.0\r\n (Documento No Oficial) \r\n (uso interno)");

            return parrafo;
        }

        public static Paragraph generar_INFORMACION()
        {

            Paragraph parrafo = new Paragraph();

            parrafo.Alignment = Element.ALIGN_JUSTIFIED;
            parrafo.Font = FontFactory.GetFont("Arial", 12);
            parrafo.Font.SetStyle(Font.NORMAL);
            parrafo.Leading = 10;
            parrafo.SpacingAfter = 1;
            parrafo.SpacingBefore = 1;


            parrafo.Add("La red de monitoreo radiológico ambiental ubicada en el Centro de Estudios Nucleares La Reina, consta de cinco estaciones ubicadas en las siguientes coordenadas:");

            return parrafo;
        }

        public static Image plano()
        {
            //Generamos imágen
            // EPEIRU -1
            Image mapa = Image.GetInstance("c:\\SWCom\\mapalareina1.PNG");
            mapa.Alignment = Element.ALIGN_CENTER;
            mapa.ScaleToFit(500f, 600f);
            return mapa;
        }

        public static PdfPTable datos_estadisticos(string promedio, string varianza, string desviacion, string minimo, string maximo, string total_datos, DateTime fechaMax)
        {
            PdfPTable estructura = new PdfPTable(8);
            estructura.SetWidthPercentage(new float[] { 75, 75, 75, 75, 75, 75, 75, 75 }, PageSize.A4);
            estructura.AddCell(new Paragraph("Promedio", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Varianza", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Desviacion \r\n Estandard", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Minimo", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Maximo", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Fecha Maximo", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Hora Maximo", FontFactory.GetFont("Arial", 9)));
            estructura.AddCell(new Paragraph("Total de \r\n Datos", FontFactory.GetFont("Arial", 9)));
            foreach (PdfPCell celda in estructura.Rows[0].GetCells())
            {
                celda.BackgroundColor = BaseColor.LIGHT_GRAY;
                celda.HorizontalAlignment = 1;
                celda.Padding = 3;
            }

            PdfPCell celda1 = new PdfPCell(new Paragraph(promedio, FontFactory.GetFont("Arial", 10)));
            PdfPCell celda2 = new PdfPCell(new Paragraph(varianza, FontFactory.GetFont("Arial", 10)));
            PdfPCell celda3 = new PdfPCell(new Paragraph(desviacion, FontFactory.GetFont("Arial", 10)));
            PdfPCell celda4 = new PdfPCell(new Paragraph(minimo, FontFactory.GetFont("Arial", 10)));
            PdfPCell celda5 = new PdfPCell(new Paragraph(maximo, FontFactory.GetFont("Arial", 10)));
            PdfPCell celda6 = new PdfPCell(new Paragraph(fechaMax.ToShortDateString(), FontFactory.GetFont("Arial", 10)));
            PdfPCell celda7 = new PdfPCell(new Paragraph(fechaMax.ToShortTimeString(), FontFactory.GetFont("Arial", 10)));
            PdfPCell celda8 = new PdfPCell(new Paragraph(total_datos, FontFactory.GetFont("Arial", 10)));

            celda1.HorizontalAlignment = 1;
            celda2.HorizontalAlignment = 1;
            celda3.HorizontalAlignment = 1;
            celda4.HorizontalAlignment = 1;
            celda5.HorizontalAlignment = 1;
            celda6.HorizontalAlignment = 1;
            celda7.HorizontalAlignment = 1;
            celda8.HorizontalAlignment = 1;

            estructura.AddCell(celda1);
            estructura.AddCell(celda2);
            estructura.AddCell(celda3);
            estructura.AddCell(celda4);
            estructura.AddCell(celda5);
            estructura.AddCell(celda6);
            estructura.AddCell(celda7);
            estructura.AddCell(celda8);

            return estructura;
        }

        public static Image GenerarGrafico(MemoryStream ms)
        {
            //Generamos imágen
            Image imagen = Image.GetInstance(ms);
            imagen.Alignment = Element.ALIGN_CENTER;
            imagen.ScaleToFit(400f, 600f);
            return imagen;
        }

    }
}